package cn.seaboot.admin.user.context;

import java.util.Collection;

/**
 * 权限配置缓存
 * <p>
 * 在 B/S 架构中，鉴权对性能的浪费，是非常严重的。
 * 为了追求极致的性能，需要最大程度地复用配置信息。
 * <p>
 * 专门提取一个接口，主要是为了解耦
 * <p>
 * 在小型系统中，序列化过程中消耗的性能，也是可回收的，我们可以用 map 之类的简单结构；
 * 在大型系统中，可以使用 redis 之类的内存缓存，将客户鉴权信息，在不同系统中进行共享；
 * <p>
 * 注意：当前设计，不会缓存用户级别的数据，一般来说，鉴权框架，会有对应的会话缓存策略，按照对应的 API 进行接入即可。
 *
 * <p>
 * 会有两个不同的模块调用缓存:
 * 用户模块（配置模块），界面每次调整，都要及时清空缓存。
 * 鉴权模块（登录模块），为了避免频繁查询，会尝试写入缓存。
 *
 * @param <R> 角色
 * @param <P> 权限
 * @author Mr.css
 * @version 2022-06-01 16:27
 */
public interface AuthorityCache<R, P> {

    /**
     * 输入角色授权信息
     *
     * @param key   key
     * @param roles 角色
     */
    void putRoles(String key, Collection<R> roles);

    /**
     * 清除角色授权信息
     *
     * @param key key
     */
    void removeRoles(String key);

    /**
     * 清除角色授权信息
     *
     * @param key key
     */
    Collection<R> getRoles(String key);

    /**
     * 输入角色授权信息
     *
     * @param key   key
     * @param roles 角色
     */
    void putPermits(String key, Collection<P> roles);

    /**
     * 清除角色授权信息
     *
     * @param key key
     */
    void removePermits(String key);

    /**
     * 清除角色授权信息
     *
     * @param key key
     */
    Collection<R> getPermits(String key);


    /**
     * 清除所有缓存，像是批量修改等业务，无法精准定位到修改内容，只能全量清除
     */
    void clear();
}
